package com.samba.beans;

import java.util.Collection;
import java.util.List;

import javax.ejb.Remote;
import javax.ejb.Stateful;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import com.samba.entites.Category;
import com.samba.entites.CreditProjetUtilisateur;
import com.samba.entites.Projet;
import com.samba.entites.Type;
import com.samba.entites.Utilisateur;
import com.samba.sessions.RichClientServiceDAO;


@Stateful
@Remote( { RichClientServiceDAO.class })
public class RichClientServiceBean implements  RichClientServiceDAO{

	@PersistenceContext(unitName = "GestionMicroCredit")
	private EntityManager GestionMicroCreditEM;

	//***************************************
	//*********** CRUD Methods **************
	//***************************************
	//************ Utilisateur *********************
	public Utilisateur addUser(Utilisateur user) {
		GestionMicroCreditEM.persist(user);
		return user;
	}

	public Utilisateur updateUser(Utilisateur user) {
		GestionMicroCreditEM.merge(user);
		return user;
	}

	public Utilisateur deleteUser(Utilisateur user) {
		GestionMicroCreditEM.remove(user);
		return user;
	}
	public void removeUserById(int id) {
		Utilisateur u = GestionMicroCreditEM.find(Utilisateur.class, id);
		if(u!=null)
			GestionMicroCreditEM.remove(u);
	}

	public Collection<Utilisateur> findAllUsers() {
		Query query = GestionMicroCreditEM.createQuery(
				"SELECT user FROM Utilisateur AS user");
		return query.getResultList();
	}

	public Utilisateur findUserById(Integer id) {

		return GestionMicroCreditEM.find(Utilisateur.class, id);
	}

	public List<Utilisateur> findUserWithFirstnameLike(String firstnameLike) {
		Query q = GestionMicroCreditEM.createQuery(
				"SELECT user FROM U AS user " +
				"WHERE user.firstName LIKE ?1"
		);
		q.setParameter(1, firstnameLike);
		return q.getResultList();
	}

	public Utilisateur findUserFromProjeet(Projet projet) {
		Query query = GestionMicroCreditEM.createQuery(
				"SELECT user " +
				"FROM Projet AS user " +
				"WHERE ?1 MEMBER OF user.preteurs" 
		);
		query.setParameter(1, projet);
		return (Utilisateur) query.getSingleResult();
	}

	public Utilisateur findUserFromLentProjet(CreditProjetUtilisateur creditPojet)
	{
			Query query = GestionMicroCreditEM.createQuery(
					"SELECT creditPojet.utilisateur " +
					"FROM CreditProjetUtilisateur AS creditPojet " +
					"WHERE creditPojet.user=?1" 
			);
			query.setParameter(1, creditPojet);
			return (Utilisateur) query.getSingleResult();
	}
	

	
	//***************************************
	//*********** CRUD Methods **************
	//***************************************
	//************ Type *********************
	//***************************************

	public Type addType(Type type) {
		GestionMicroCreditEM.persist(type);
		return type;
	}

	public void deleteType(Type type) {
		GestionMicroCreditEM.remove(type);
		
	}

	public Type updateType(Type type) {
		GestionMicroCreditEM.merge(type);
		return type;
	}
	
	public Collection<Type> findAllTypes() {
		Query query = GestionMicroCreditEM.createQuery(
				"SELECT type From Type As type");
				return query.getResultList();
	}
	
	

	//***************************************
	//*********** CRUD Methods **************
	//***************************************
	//************ Category *****************
	//***************************************
	
	public Category addCategory(Category category) {
		GestionMicroCreditEM.persist(category);
		return category;
	}

	public Category updateCategory(Category category) {
		GestionMicroCreditEM.merge(category);
		return category;
	}
	public void deleteCategory(Category category) {
		GestionMicroCreditEM.remove(category);
		
	}

	public Collection<Category> findCategory() {
		Query query = GestionMicroCreditEM.createQuery(
				"SELECT category From Category As category");
				return query.getResultList();
	}

	
	//***************************************
	//*********** CRUD Methods **************
	//***************************************
	//************ Projet ****************
	//***************************************
	public Projet addProjet(Projet projet) {
		GestionMicroCreditEM.persist(projet);
		return projet;
	}


	public void removeProjet(Projet projet) {
		GestionMicroCreditEM.remove(projet);
		
	}

	public Projet updateProjet(Projet projet) {
		GestionMicroCreditEM.merge(projet);
		return projet;
	}

	public Collection<Projet> findAllProjetsByUser(Utilisateur user) {
		// TODO Auto-generated method stub
		return null;
	}

	public Projet findProjetById(Integer id) {
		return GestionMicroCreditEM.find(Projet.class, id);
	}

	public Collection<Projet> findProjetsByUserId(int userId) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Projet linkAProejtToAUser(Integer idProjet, Integer idUser) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public CreditProjetUtilisateur addCreditProjetUtilisateur(Projet projet,
			CreditProjetUtilisateur credit) {
		credit.setProjet(projet);
		GestionMicroCreditEM.persist(credit);
		return credit;
	}
}
